/********************************************************************************
* @author: Ternura_xiang
* @email: 2022101883@nit.edu.cn
* @date: Apr 5, 2025
* @version: 1.0
* @description: 按键驱动及按键事件
********************************************************************************/
#include "key.h"
#include "display.h"
#include "tim.h"

#define KB1 ~HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)
#define KB2 ~HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12)
#define KEYPORT KB1 | (KB2<<1) | (1<<2) | (1<<3) | 0xf0
unsigned char Trag; // 全局变量，单次触发
unsigned char Cont; // 全局变量，长按
__IO uint32_t keyTick = 0;


/**
 * @brief 读取当前按键的状态
 */
void Key_Read(void){
    unsigned char ReadData = ~KEYPORT;
    Trag = ReadData & (ReadData ^ Cont);
    Cont = ReadData;
}


/**
 * @brief 按键事件
 */
void Key_Process(void){
    if(uwTick - keyTick < 10) return;   // 消抖(距离上次进入此函数需>10ms)
    keyTick = uwTick;
    Key_Read();

    if(display_mode == DISPLAY_MODE_MAIN){
        if(Trag & 0x02){
            // 按键二按下 -> 确认进入该模式
            display_mode = display_mode_select_now;
            display_mode_change_flag = 1;
        }
    }
    else if(display_mode == DISPLAY_MODE_THRESHOLD){
        if(Trag & 0x02){
            // 按键二按下 -> 切换到下一个图表
            threshold_mode = (threshold_mode == THRESHOLD_MODE_B) ? THRESHOLD_MODE_L: threshold_mode++;
        }
        else if(Trag & 0x01){
            // 按键一按下 -> 返回主界面
            display_mode = DISPLAY_MODE_MAIN;
            display_mode_change_flag = 1;
        }
    }
    else if(display_mode == DISPLAY_MODE_ADC){
        if(Trag & 0x02){
        }
        else if(Trag & 0x01){
            // 按键一按下 -> 返回主界面
            display_mode = DISPLAY_MODE_MAIN;
            display_mode_change_flag = 1;
        }
    }
    else if(display_mode == DISPLAY_MODE_PWM){
        if(Trag & 0x02){
            pwm_change = pwm_change ? 0 : 1;
        if(pwm_select_now == PWM_SELECT_DUTY1 || pwm_select_now == PWM_SELECT_DUTY2){
            pwm_duty_change_flag = 1;}  // 刷新占空比显示
        else if(Trag & 0x01 && pwm_change == 0){    // 设置模式下不允许返回
            // 按键一按下 -> 返回主界面
            display_mode = DISPLAY_MODE_MAIN;
            display_mode_change_flag = 1;
            HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_ALL);
            }
        }
    }
    else if(display_mode == DISPLAY_MODE_SETTING){
        if(Trag & 0x02){
        }
        else if(Trag & 0x01){
            // 按键一按下 -> 返回主界面
            display_mode = DISPLAY_MODE_MAIN;
            display_mode_change_flag = 1;
        }
    }
}
